home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Magnum One
/
Magnum One (Mid-American Digital) (Disc Manufacturing).iso
/
d12
/
asmbler.arc
/
UTIL.INC
< prev
Wrap
Text File
|
1988-11-19
|
10KB
|
484 lines
NUL EQU 0
TAB EQU 9
LF EQU 10
CR EQU 13
STDIN EQU 0
STDOUT EQU 1
STDERR EQU 2
STDAUX EQU 3
STDPRN EQU 4
PSP STRUC
INTVECT DW ?
TOM DW ?
RES1 DB ?
DOSLONG DB 5 DUP (?)
TERMINA DD ?
CTRLBRK DD ?
CRITERR DD ?
DOS1 DB 22 DUP (?)
ENVIRO DW ?
DOS2 DB 46 DUP (?)
FPA1 DB 16 DUP (?)
FPA2 DB 20 DUP (?)
UPA DB 128 DUP (?)
PSP ENDS
DTA STRUC
DOS3 DB 21 DUP (?)
ATTRIB DB
TIME DW
DATE DW
LSIZE DW
HSIZE DW
FNAME DB 13 DUP (?)
DTA ENDS
EXECDEF STRUC
NENVIRO DW
COMMND DW 2 DUP (0)
FCB5CH DW 2 DUP (0)
FCB6CH DW 2 DUP (0)
EXECDEF ENDS
SCANPARAM MACRO P1,P2
LOCAL SC1
MOV AL,' '
JCXZ P2
REPE SCASB
JCXZ P2
MOV P1,DI
DEC P1
REPNE SCASB
JCXZ SC1
DEC DI
SC1: MOV BYTE PTR [DI],NUL
INC DI
ENDM
MSCANSWITCH MACRO
SCANSWITCH:
???
RET
ENDM
MSCANARGS MACRO
LOCAL DEND,ARGBUF,ERR1,NXT0,NXT1,NXT2,NXT3,NXT4,NXT5,SPACE
SCANARGS:
MOV ARGC,0
CLD
MOV DI,OFFSET ARGBUF
MOV SI,OFFSET UPA
LODSB ; Skip past length
; ch = getch();
LODSB
NXT0: ; loop {
; while (ch == ' ') ch = getch();
SPACE: CMP AL,' '
JNE NXT1
LODSB
JMP SPACE
NXT1: ; break when (ch == \nl)
CMP AL,CR
JE DEND
; argv[argc++] = &buff[i];
MOV BX,ARGC
SAL BX,1
INC ARGC
MOV ARGV[BX],DI
; if (ch == '"') {
CMP AL,'"'
JNE NXT2
; ch = getch();
LODSB
CMP AL,CR
JE ERR1
; loop {
NXT3: ; while (ch != '"') { putch(ch); ch = getch(); }
CMP AL,'"'
JE NXT4
STOSB
LODSB
CMP AL,CR
JE ERR1
JMP NXT3
NXT4: ; ch = getch();
LODSB
; break when (ch != '"');
CMP AL,'"'
JNE NXT5
; putch(ch);
STOSB
; ch = getch();
LODSB
CMP AL,CR
JE ERR1
; }
JMP NXT3
NXT2: ; } else
; while (ch != ' ' && ch != '"' && ch != \nl) {
CMP AL,' '
JE NXT5
CMP AL,'"'
JE NXT5
CMP AL,CR
JE NXT5
; putch(ch);
STOSB
; ch = getch();
LODSB
; No error here if we get the CR
; }
JMP NXT2
; }
NXT5: ; putch(\nul);
MOV AH,AL
MOV AL,NUL
STOSB
MOV AL,AH
; }
JMP NXT0
DEND: RET
ERR1: MOV AL,20
JMP ERROR
EVEN
ARGC DW 0
ARGV DW 32 DUP (0)
ARGBUF DB 128 DUP (0)
ENDM
MSKIPWHITE MACRO
LOCAL NXT1,NXT2
SKIPWHITE:
CMP BYTE PTR [SI],' '
JE NXT1
CMP BYTE PTR [SI],TAB
JNE NXT2
NXT1: INC SI
DEC CX
JCXZ NXT2
JMP SKIPWHITE
NXT2: RET
ENDM
MCOPYSTR MACRO
LOCAL ERR1,SPACE,NXT1
COPYSTR:
PUSH DS
POP ES
JCXZ ERR1
PUSH CX
PUSH DI
MOV DI,SI
REPNE SCASB
POP DI
MOV AX,CX
POP CX
PUSH AX
SUB CX,AX
REP MOVSB
MOV BYTE PTR [DI-1],NUL
POP CX
RET
ERR1: MOV AL,20
JMP ERROR
ENDM
MSKIPSTR MACRO
LOCAL ERR1
SKIPSTR:
PUSH DS
POP ES
PUSH DI
MOV DI,SI
JCXZ ERR1
REPNE SCASB
MOV SI,DI
POP DI
RET
ERR1: MOV AL,20
JMP ERROR
ENDM
MREPLACE MACRO
LOCAL NXT1
REPLACE:
REPNE SCASB
JNE NXT1
MOV BYTE PTR [DI-1],AH
JMP REPLACE
NXT1: RET
ENDM
MSETSWITCH MACRO
SETSWITCH:
; NEW SWITCH IN DL
MOV AH,37H ; INTERNAL CALL GET SWITCHAR
MOV AL,1 ; 1 = SET SWITCHAR ??
INT 21H
RET
ENDM
MGETSWITCH MACRO
GETSWITCH:
MOV AH,37H ; INTERNAL CALL GET SWITCHAR
MOV AL,0 ; 1 = SET SWITCHAR ??
INT 21H
; SWITCH IN DL
RET
ENDM
MCMPDATE MACRO
LOCAL CMP1
CMPDATE:
; DX:CX ? ES:DI
MOV AX,ES
CMP AX,DX
JNZ CMP1
CMP DI,CX
CMP1: RET
ENDM
MREAD MACRO
LOCAL ERR1
READ:
MOV AH,3FH
INT 21H
JC ERR1
RET
ERR1: JMP ERROR
ENDM
MSHRINKSPACE MACRO
LOCAL ERR1
SHRINKSPACE:
MOV AH,4AH
INT 21H
JC ERR1
RET
ERR1: JMP ERROR
ENDM
MOPEN MACRO
LOCAL ERR1
OPEN:
MOV AH,3DH
INT 21H
JC ERR1
RET
ERR1: JMP ERROR
ENDM
MCLOSE MACRO
LOCAL ERR1
CLOSE:
MOV AH,3EH
INT 21H
JC ERR1
RET
ERR1: JMP ERROR
ENDM
MGETDATE MACRO
LOCAL ERR1
GETDATE:
MOV AH,57H
MOV AL,0
INT 21H
JC ERR1
RET
ERR1: JMP ERROR
ENDM
MEXECOMM MACRO
LOCAL EXECBLK,ERR1,SPSAVE,SSSAVE
EXECOMM:
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSH BP
PUSH DS
PUSH ES
MOV SPSAVE,SP
MOV SSSAVE,SS
MOV EXECBLK.NENVIRO,0
MOV EXECBLK.COMMND[0],DX
MOV EXECBLK.COMMND[2],DS
MOV AX,CS
MOV ES,AX
MOV BX,OFFSET EXECBLK
XOR BP,BP
MOV AX,[BP].ENVIRO
MOV DS,AX
MOV DX,8
MOV AH,4BH
MOV AL,0
INT 21H
MOV SS,CS:SSSAVE
MOV SP,CS:SPSAVE
POP ES
POP DS
POP BP
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
JC ERR1
RET
ERR1: JMP ERROR
EVEN
EXECBLK EXECDEF <>
SPSAVE DW
SSSAVE DW
ENDM
MFIRSTFILE MACRO
ENDM
MNEXTFILE MACRO
NEXTFILE:
MOV AH,4FH
INT 21H
RET
ENDM
MWRITEINT MACRO
LOCAL OUT,RECRS,TEMPBUF
FWRITEINT:
PUSH SI
PUSH DX
PUSH DI
MOV DI,OFFSET TEMPBUF
MOV SI,10
CALL RECRS
MOV BYTE PTR [DI],NUL
MOV DX,OFFSET TEMPBUF
CALL FWRITESTR
POP DI
POP DX
POP SI
RET
RECRS: TEST AX,AX
JZ OUT
XOR DX,DX
DIV SI
PUSH DX
CALL RECRS
POP AX
ADD AL,'0'
STOSB
OUT: RET
TEMPBUF DB 12 DUP (0)
ENDM
MWRITESTR MACRO
FWRITESTR:
PUSH AX
PUSH DI
PUSH CX
MOV DI,DX
MOV CX,32767
MOV AL,NUL
REPNE SCASB
SUB CX,32767
NEG CX
DEC CX
MOV AH,40H
INT 21H
POP CX
POP DI
POP AX
RET
ENDM
MWRITELN MACRO
LOCAL CRLF
FWRITELN:
PUSH CX
PUSH DX
PUSH AX
MOV DX,OFFSET CRLF
MOV CX,2
MOV AH,40H
INT 21H
POP AX
POP DX
POP CX
RET
CRLF DB CR,LF
ENDM
MNORMAL MACRO
NORMAL:
MOV AL,0
MOV AH,4CH
INT 21H
ENDM
MKERR MACRO P1,P2
ERR&P1 DB P2,NUL
ENDM
ERRSTR MACRO P1
MKERR %ERRLB,P1
ERRLB = ERRLB + 1
ENDM
ERRLBL MACRO P1
DW ERR&P1
ENDM
MERROR MACRO
ERROR: XOR AH,AH
PUSH AX
MOV BX,AX
SAL BX,1
MOV DX,ERRTABLE[BX]
MOV BX,STDERR ; Standard error
CALL FWRITESTR
CALL FWRITELN
POP AX ; Get the error number
MOV AH,4CH
INT 21H ; Return to host program
ERRLB = 0
ERRSTR 'Internal error' ; 0
ERRSTR 'Invalid function number' ; 1
ERRSTR 'File not found' ; 2
ERRSTR 'Path not found' ; 3
ERRSTR 'Too many open files' ; 4
ERRSTR 'Access denied' ; 5
ERRSTR 'Invalid handle' ; 6
ERRSTR 'Memory control blocks destroyed' ; 7
ERRSTR 'Insufficient memory' ; 8
ERRSTR 'Invalid memory block address' ; 9
ERRSTR 'Invalid environment' ; 10
ERRSTR 'Invalid format' ; 11
ERRSTR 'Invalid access code' ; 12
ERRSTR 'Invalid data' ; 13
ERRSTR '*** UNSPECIFIED ***' ; 14
ERRSTR 'Invalid drive was specified' ; 15
ERRSTR 'Attempted to remove current directory' ; 16
ERRSTR 'Not same device' ; 17
ERRSTR 'No more files' ; 18
ERRSTR 'Invalid number of parameters' ; 19
ERRSTR 'Syntax error' ; 20
ERRX = 1
ERRTABLE DW ERR0
REPT ERRLB-1
ERRLBL %ERRX
ERRX = ERRX + 1
ENDM
ENDM